/*
    继承
    一、继承的特性
    1、父类更抽象、子类够具体
    2、父类具有一般行为和特性，子类可以扩展父类的行为和特性
    二、如何实现继承
    1、实现继承的思路
    1)、编写父类
    2)、编写子类，使用extends关键字来实现
    3）、在子类中使用方法重写完成对父类具体化
    4）、可以在子类中扩展自身的特性和行为
    2、语法
    class 子类 extends 父类{

    }
    3、super关键字
    调用父类中的构造方法：super()
    调用父类中的方法:super.方法
    4、方法重写
    在继承关系中，子类中的方法和父类中方法中名称相同，参数的个数和参数的类型相同的这样一种情况称为方法重写
    方法重写的效果是子类中内容完全覆盖父类中的内容
    5、继承好处：扩展代码，让代码复用性提高，可扩展性和可维护性提高
*/
class Vehicle{
    no:string=''
    color:string=''
    constructor(no:string,color:string){
        this.no=no
        this.color=color
    }
    start(){
        console.log('我是机动车，我可以启动');
    }
    stop(){
        console.log('我是机动车，我可以停止');
    }
    show(){
      return `车牌:${this.no}\n颜色:${this.color}`
    }
}
class Bus extends Vehicle{
    company:string=''
    constructor(no:string,color:string,company:string){
        //super()函数的调用必须放在子类构造函数的首行
        super(no,color)
        this.company=company
    }
    start(){
        //如果子类中要调用父类中的方法，就是用super.方法名
        //如果父类是被private修饰的，子类是不能继承的
        super.start()
        console.log('我是BUS，我可以启动'); 
    }
    show(){
       return super.show()+"\n所属公司:"+this.company 
    }
}

let bus1=new Bus("陕A888888","红色","公交六公司")
console.log(bus1.show());
bus1.start()
bus1.stop()
